package com.zzy.deadlock;

import java.util.LinkedList;

public class Stack {

	private LinkedList list = new LinkedList();

	public void push(Object x) {
		synchronized (list) {
			list.addLast(x);
			list.notify();
		}
	}

	public Object pop() throws Exception {
		synchronized (list) {
			if (list.size() <= 0) {
				list.wait();
			}
			return list.removeLast();
		}
	}

	public static void main(String[] args) throws Exception {
		final Stack s = new Stack();
		// System.out.println(s.pop());
		// s.push(1);

		new Thread(new Runnable() {

			@Override
			public void run() {
				try {
					System.out.println(s.pop());
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}).start();

		new Thread(new Runnable() {

			@Override
			public void run() {
				try {
					Thread.sleep(3000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				s.push(1);
			}
		}).start();
	}

}











//一个问题： list 不是私有，看起来不太安全。

//再有：pop的时候，拿了两个锁，this, list； wait()释放了this, hold list，也就是push再也不可能notify()了，所有的操作都卡在synchronized(list)上，死锁了。
//public class Stack {
//
//	LinkedList list = new LinkedList();
//
//	public synchronized void push(Object x) {
//	synchronized(list) {
//	list.addLast( x );
//	notify();
//	}
//	}
//
//	public synchronized Object pop()
//	throws Exception {
//	synchronized(list) {
//	if( list.size() <= 0 ) {
//	wait();
//	}
//	return list.removeLast();
//	}
//	}
//	} 